#include "e2d/yml/impl/Serializer.h"
#include "e2d/yml/impl/FinalSerializer.h"

#include "e2d/core/impl/components.h"

using Serializer = e2d::BasicSerializer;

template<>
 void Serializer::Encode<e2d::Entity>(YAML::Node& node, const e2d::Entity& inst)
{

	Encode<e2d::Object>(node, inst);
	SetVariable<std::string>(node, "m_Name", inst.m_Name);
	
	e2d::FinalSerializer finalSerialier;
	finalSerialier.EncodeEntity(node, inst);

	SetPtrArrayVariable<e2d::Entity>(node, "m_Children", inst.m_Children, [](const e2d::Entity& e) {
		return e.ExistCalculate(); });
};


template<>
 bool Serializer::Decode<e2d::Entity>(const YAML::Node& node, e2d::Entity& inst)
{
	Decode<e2d::Object>(node, inst);
	GetVariable<std::string>(node, "m_Name", inst.m_Name);

	e2d::FinalSerializer finalSerialier;
	finalSerialier.DecodeEntity(node, inst);

	YAML::Node childrenNode = node["m_Children"];

	for (const auto& childNode : childrenNode)
	{
		if (childNode.IsDefined())
		{
			auto child = inst.NewChild();
			bool flag = Decode<e2d::Entity>(childNode, *child);

			inst.SnatchEntityAsChild(child);
		}

	}

	return true;
}
